<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>Git  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="" />

<meta name="keywords" content="two, three, ">


<meta property="og:title" content="Git  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/tool/git/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content=""/>
<meta property="og:article:published_time" content="2017-12-14T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-12-14T00:00:00Z" />

  
    
<meta property="og:article:tag" content="two">
    
<meta property="og:article:tag" content="three">
    
  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "Git",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-12-14",
    "description": "",
    "wordCount":  1292 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/tool/git/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tool" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>Git
</h1>

</header>

  <div class="container content">
  <h3 id="git">Git概念</h3>
<h4 id="11-git">1.1. Git库中由三部分组成</h4>
<pre><code>   Git 仓库就是那个.git 目录，其中存放的是我们所提交的文档索引内容，Git 可基于文档索引内容对其所管理的文档进行内容追踪，从而实现文档的版本控制。.git目录位于工作目录内。 
</code></pre>
<p>1） 工作目录：用户本地的目录；<!-- raw HTML omitted -->  
2） Index（索引）：将工作目录下所有文件（包含子目录）生成快照，存放到一个临时的存储区域，Git 称该区域为索引。 <!-- raw HTML omitted --> 
3） 仓库：将索引通过commit命令提交至仓库中，每一次提交都意味着版本在进行一次更新。<!-- raw HTML omitted --></p>
<p><img src="/image/GitImage/clip_image002.jpg" alt="Alt text"></p>
<h4 id="12-git">1.2. 使用Git时的初始化事项</h4>
<p>1.2.1. Git初始化配置 <!-- raw HTML omitted --> 
1） 配置使用git仓库的人员姓名 
git config &ndash;global user.name &ldquo;Your Name Comes Here&rdquo; 
2） 配置使用git仓库的人员email 
git config &ndash;global user.email <a href="mailto:you@yourdomain.example.com">you@yourdomain.example.com</a> 
1.2.2. Git文档忽略机制 <!-- raw HTML omitted --> 
工作目录中有一些文件是不希望接受Git 管理的，譬如程序编译时生成的中间文件等等。Git 提供了文档忽略机制，可以将工作目录中不希望接受Git 管理的文档信息写到同一目录下的.gitignore 文件中。 
例如：工作目录下有个zh目录，如果不想把它加入到Git管理中，则执行： 
echo “zh” &gt; .gitignore 
git add . 
有关gitignore 文件的诸多细节知识可阅读其使用手册：man gitignore</p>
<h4 id="13-gitrepo">1.3. Git与Repo的比较</h4>
<pre><code>   Git操作一般对应一个仓库，而Repo操作一般对应一个项目，即一个项目会由若干仓库组成。 
</code></pre>
<p>例如，在操作整个Recket项目时使用Repo，而操作其中的某个仓库时使用Git。在包含隐藏目录.git的目录下执行git操作。</p>
<h3 id="2-git-help">2. Git help</h3>
<pre><code>   Git help 获取git基本命令 
</code></pre>
<p>（如果要知道某个特定命令的使用方法，例如：使用Git help clone，来获取git clone的使用方法）</p>
<h3 id="3-git">3. Git本地操作基本命令</h3>
<h4 id="31-git-init">3.1. Git init</h4>
<p>或者使用git init-db。 
创建一个空的Git库。在当前目录中产生一个.git 的子目录。以后，所有的文件变化信息都会保存到这个目录下，而不像CVS那样，会在每个目录和子目录下都创建一个CVS目录。 
在.git目录下有一个config文件，可以修改其中的配置信息。</p>
<h4 id="32-git-add">3.2. Git add</h4>
<p>将当前工作目录中更改或者新增的文件加入到Git的索引中，加入到Git的索引中就表示记入了版本历史中，这也是提交之前所需要执行的一步。 
可以递归添加，即如果后面跟的是一个目录作为参数，则会递归添加整个目录中的所有子目录和文件。例如： 
git add dir1 （ 添加dir1这个目录，目录下的所有文件都被加入 ） 
Git add f1 f2 （ 添加f1，f2文件） 
git add .      ( 添加当前目录下的所有文件和子目录 )</p>
<h4 id="33-git-rm">3.3. Git rm</h4>
<p>从当前的工作目录中和索引中删除文件。 
可以递归删除，即如果后面跟的是一个目录做为参数，则会递归删除整个目录中的所有子目录和文件。例如： 
git rm –r * （进入某个目录中，执行此语句，会删除该目录下的所有文件和子目录） 
git rm f1    (删除文件f1，包含本地目录和index中的此文件记录) 
git rm &ndash;ached f1 (删除文件f1，不会删除本地目录文件，只删除index中的文件记录；将已经git add的文件remove到cache中,这样commit的时候不会提交这个文件, 适用于一下子添加了很多文件, 却又想排除其中个别几个文件的情况.)</p>
<h4 id="34-git-commit">3.4. Git commit</h4>
<p>提交当前工作目录的修改内容。 
直接调用git commit命令，会提示填写注释。通过如下方式在命令行就填写提交注释：git commit -m &ldquo;Initial commit of gittutor reposistory&rdquo;。 注意，和CVS不同，git的提交注释必须不能为空，否则就会提交失败。 
git commit还有一个 -a的参数，可以将那些没有通过git add标识的变化一并强行提交，但是不建议使用这种方式。 
每一次提交，git就会为全局代码建立一个唯一的commit标识代码，用户可以通过git reset命令恢复到任意一次提交时的代码。 
git commit –-amend –m “message” （在一个commit id上不断修改提交的内容）</p>
<h4 id="35-git-status">3.5. Git status</h4>
<p>查看版本库的状态。可以得知哪些文件发生了变化，哪些文件还没有添加到git库中等等。 建议每次commit前都要通过该命令确认库状态。 
最常见的误操作是， 修改了一个文件， 没有调用git add通知git库该文件已经发生了变化就直接调用commit操作， 从而导致该文件并没有真正的提交。这时如果开发者以为已经提交了该文件，就继续修改甚至删除这个文件，那么修改的内容就没有通过版本管理起来。如果每次在 提交前，使用git status查看一下，就可以发现这种错误。因此，如果调用了git status命令，一定要格外注意那些提示为 “Changed but not updated:”的文件。 这些文件都是与上次commit相比发生了变化，但是却没有通过git add标识的文件。</p>
<h4 id="36-git-log">3.6. Git log</h4>
<p>查看历史日志，包含每次的版本变化。每次版本变化对应一个commit id。 
Git log -1 
-1的意思是只显示一个commit，如果想显示5个，就-5。不指定的话，git log会从该commit一直往后显示。 
Git log &ndash;stat –summary （显示每次版本的详细变化） 
在项目日志信息中，每条日志的首行（就是那一串字符）为版本更新提交所进行的命名，我们可以将该命名理解为项目版本号。项目版本号应该是唯一的，默认由 Git 自动生成，用以标示项目的某一次更新。如果我们将项目版本号用作git-show 命令的参数，即可查看该次项目版本的更新细节。例如： <!-- raw HTML omitted --></p>
<ol>
<li>Git log 
clip_image004 <!-- raw HTML omitted --> 
2）Git show 
clip_image006<!-- raw HTML omitted -->  
实际上，上述命令并非是真正的进行版本号自定义，只是制造了一个tag对象而已，这在进行项目版本对外发布时比较有用。</li>
</ol>
<h4 id="37-git-merge">3.7. Git merge</h4>
<p>把服务器上下载下来的代码和本地代码合并。或者进行分支合并。 
例如：当前在master分支上，若想将分支dev上的合并到master上，则git merge dev 
注意：git merge nov/eclair_eocket （是将服务器git库的eclair_eocket分支合并到本地分支上） 
git rebase nov/eclair_eocket （是将服务器git库的eclair_eocket分支映射到本地的一个临时分支上，然后将本地分支上的变化合并到这个临时分支，然后再用这个临时分支初始化本地分支）</p>
<h4 id="38-git-diff">3.8. Git diff</h4>
<p>把本地的代码和index中的代码进行比较，或者是把index中的代码和本地仓库中的代码进行比较。 
1） Git diff 
比较工作目录和Index中的代码。<!-- raw HTML omitted -->  
2） Git diff - - cached 
比较index和本地仓库中的代码。<!-- raw HTML omitted --></p>
<h4 id="39-git-checkout">3.9. Git checkout</h4>
<p>3.9.1. 切换到分支 <!-- raw HTML omitted --></p>
<ol>
<li>创建一个新分支，并切换到该分支上 
Git checkout –b 新分支名 <!-- raw HTML omitted --> 
2）切换到某个已经建立的本地分支local_branch 
Git checkout local_branch <!-- raw HTML omitted --> 
（使用cat .git/HEAD后，显示refs:refs/heads/ local_branch）</li>
<li>切换到服务器上的某个分支remote_branch <!-- raw HTML omitted --> 
Git checkout remote_branch 
（远程分支remote_branch可以通过 git branch –r 列出）</li>
<li>切换到某个commit id 
Git checkout commit_id 
（使用cat .git/HEAD后，显示commit_id）<!-- raw HTML omitted --></li>
<li>切换到某个tag 
Git checkout tag <!-- raw HTML omitted --> 
（使用cat .git/HEAD后，显示tag） 
注意： 除了1）和2）外，其余三种都只是切换到了一个临时的( no branch )状态 （this head is detached），这时用 git branch 可以看到处于（no branch）上， cat .git/HEAD 看到指向相应的commit id。 这个（no branch）只是临时存在的，并不是一个真正建立的branch。 如果此时执行2），则这个（no branch）就自动消失了；如果执行1）， 则创建新分支 new branch，并把这个(no branch)挂到这个新分支上，此时cat .git/refs/heads/new_branch 可以看到已经指向了刚才那个commit id。 
3.9.2. 用已有分支初始化新分支 
执行下面的命令，在切换到某个已经建立的local branch或者某个remote branch或者某个commit id 或者某个tag的同时，创建新分支new_branch，并且挂到这个新分支上。 <!-- raw HTML omitted --> 
1） 切换到某个已经建立的本地分支local_branch，并且使用此分支初始化一个新分支new_branch。 
git checkout –b new_branch local_branch <!-- raw HTML omitted --></li>
<li>切换到某个远程分支remote_branch，并且用此分支初始化一个新分支new_branch。 
Git checkout –b new_branch remote_branch <!-- raw HTML omitted --></li>
<li>切换到某个commit id，并建立新分支new_branch 
Git checkout –b new_branch commit_id <!-- raw HTML omitted --></li>
<li>切换到某个tag，并建立新分支new_branch 
Git checkout –b new_branch tag <!-- raw HTML omitted -->  
3.9.3. 还原代码 <!-- raw HTML omitted --> 
例如 “git checkout app/model/user.rb” <!-- raw HTML omitted -->  就会将user.rb文件从上一个已提交的版本中更新回来，未提交的工作目录中的内容全部会被覆盖。</li>
</ol>
<h4 id="310-gitlsfiles">3.10. Git-ls-files</h4>
<p>查看当前的git库中有那些文件。</p>
<h4 id="311-git-mv">3.11. Git mv</h4>
<p>重命名一个文件、目录或者链接。 
例如：Git mv helloworld.c helloworld1.c （把文件helloworld.c 重命名为 helloworld1.c）</p>
<h4 id="312-git-branch">3.12. Git branch</h4>
<p>3.12.1. 总述 <!-- raw HTML omitted --> 
在 git 版本库中创建分支的成本几乎为零，所以，不必吝啬多创建几个分支。当第一次执行git init时，系统就会创建一个名为“master”的分支。 而其它分支则通过手工创建。 
下面列举一些常见的分支策略： 
创建一个属于自己的个人工作分支，以避免对主分支 master 造成太多的干扰，也方便与他人交流协作； 
当进行高风险的工作时，创建一个试验性的分支； 
合并别人的工作的时候，最好是创建一个临时的分支用来合并，合并完成后再“fetch”到自己的分支。 
对分支进行增、删、查等操作。 
注意：分支信息一般在.git/refs/目录下，其中heads目录下为本地分支，remotes为对应服务器上的分支，tags为标签。 
3.12.2. 查看分支 <!-- raw HTML omitted --> 
git branch 列出本地git库中的所有分支。在列出的分支中，若分支名前有*，则表示此分支为当前分支。 
git branch –r 列出服务器git库的所有分支。 
（可以继续使用命令 “ git checkout -b 本地分支名 服务器分支名”来获取服务器上某个分支的代码文件）。 
3.12.3. 查看当前在哪个分支上 
cat .git/HEAD 
3.12.4. 创建一个分支 <!-- raw HTML omitted --> 
1） git branch 分支名 
虽然创建了分支，但是不会将当前工作分支切换到新创建的分支上，因此，还需要命令“git checkout 分支名” 来切换，<!-- raw HTML omitted -->  
2） git checout –b 分支名 <!-- raw HTML omitted --> 
不但创建了分支，还将当前工作分支切换到了该分支上。<!-- raw HTML omitted -->  
3.12.5. 切换到某个分支：git checkout 分支名 <!-- raw HTML omitted --> 
切换到主分支：git checkout master 
3.12.6. 删除分支 <!-- raw HTML omitted --> 
git branch –D 分支名 
注意： 删除后，发生在该分支的所有变化都无法恢复。强制删除此分支。 
3.12.7. 比较两个分支上的文件的区别 <!-- raw HTML omitted --> 
git diff master 分支名 （比较主分支和另一个分支的区别） 
3.12.8. 查看分支历史 <!-- raw HTML omitted --> 
git-show-branch （查看当前分支的提交注释及信息） <!-- raw HTML omitted --> 
git-show-branch -all（查看所有分支的提交注释及信息）例如：
<!-- raw HTML omitted --></p>
<ul>
<li>[dev] d2 
![master] m2</li>
<li>[dev] d2</li>
<li>[dev^] d1</li>
<li>[dev~2] d0</li>
<li>[master] m2 
在上述例子中， “&ndash;”之上的两行表示有两个分支dev和master， 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “&ndash;”之下的几行表示了分支演化的历史，其中 dev表示发生在dev分支上的最后一次提交，dev^表示发生在dev分支上的倒数第二次提交。dev~2表示发生在dev分支上的倒数第三次提交。 
3.12.9. 查看当前分支的操作记录 <!-- raw HTML omitted --> 
git whatchanged 
3.12.10. 合并分支 <!-- raw HTML omitted --> 
法一： <!-- raw HTML omitted --> 
git merge “注释” 合并的目标分支 合并的来源分支 
如果合并有冲突，git会有提示。 
例如：git checkout master   （切换到master分支） 
git merge HEAD dev~2 (合并master分支和dev~2分支)或者：git merge master dev~2 
法二： <!-- raw HTML omitted --> 
git pull 合并的目标分支 合并的来源分支 
例如: git checkout master （切换到master分支） 
git pull . dev~2（合并当前分支和dev~2分支）</li>
</ul>
<h4 id="313-git-rebase">3.13. Git rebase</h4>
<p>一般在将服务器最新内容合并到本地时使用，例如：在版本C时从服务器上获取内容到本地，修改了本地内容，此时想把本地修改的内容提交到服务器上；但发现服务器上的版本已经变为G了，此时就需要先执行Git rebase，将服务器上的最新版本合并到本地。例如： 
用下面两幅图解释会比较清楚一些，rebase命令执行后，实际上是将分支点从C移到了G，这样分支也就具有了从C到G的功能。 
clip_image002[6]</p>
<h4 id="314-git-reset">3.14. Git reset</h4>
<p>库的逆转与恢复除了用来进行一些废弃的研发代码的重置外，还有一个重要的作用。比如我们从远程clone了一个代码库，在本地开发后，准备提交回远程。但是本地代码库在开发时，有功能性的commit，也有出于备份目的的commit等等。总之，commit的日志中有大量无用log，我们并不想把这些 log在提交回远程时也提交到库中。 因此，就要用到git reset。 
git reset的概念比较复杂。它的命令形式：git reset [&ndash;mixed | &ndash;soft | &ndash;hard] [<!-- raw HTML omitted -->] 
命令的选项： <!-- raw HTML omitted --> 
&ndash;mixed 这个是默认的选项。如git reset [&ndash;mixed] dev^(dev^的定义可以参见2.6.5)。它的作用仅是重置分支状态到dev1^, 但是却不改变任何工作文件的内容。即，从dev1^到dev1的所有文件变化都保留了，但是dev1^到dev1之间的所有commit日志都被清除了， 而且，发生变化的文件内容也没有通过git add标识，如果您要重新commit，还需要对变化的文件做一次git add。 这样，commit后，就得到了一份非常干净的提交记录。 （回退了index和仓库中的内容） 
&ndash;soft相当于做了git reset –mixed，后，又对变化的文件做了git add。如果用了该选项， 就可以直接commit了。（回退了仓库中的内容） 
&ndash;hard这个命令就会导致所有信息的回退， 包括文件内容。 一般只有在重置废弃代码时，才用它。 执行后，文件内容也无法恢复回来了。（回退了工作目录、index和仓库中的内容） 
例如： 
切换到使用的分支上；<!-- raw HTML omitted -->  
git reset HEAD^ 回退第一个记录 
git reset HEAD~2 回退第二个记录 
如果想把工作目录下的文件也回退，则使用git reset - - hard HEAD^ 回退第一个记录 
git reset - - hard HEAD~2 回退第二个记录 
还可以使用如下方法：<!-- raw HTML omitted -->  
将当前的工作目录完全回滚到指定的版本号，假设如下图，我们有A-G五次提交的版本，其中C的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20，我们执行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么结果就只剩下了A-C三个提交的版本 
clip_image004[5]</p>
<h4 id="315-git-revert">3.15. Git revert</h4>
<p>还原某次对版本的修改，例如：git revert commit_id （其中commit_id为commit代码时生成的一个唯一表示的字符串） 
例如：（3.6中）git revert dfb02e6e4f2f7b573337763e5c0013802e392818 （执行此操作，则还原上一次commit的操作）</p>
<h4 id="316-git-config">3.16. Git config</h4>
<p>利用这个命令可以新增、更改Git的各种设置，例如 “git config branch.master.remote origin” 就将master的远程版本库设置为别名叫做origin版本库。</p>
<h4 id="317-git-show">3.17. Git show</h4>
<p>显示对象的不同类型。</p>
<h4 id="318-git-tag">3.18. Git tag</h4>
<p>创建、列出、删除或者验证一个标签对象（使用GPG签名的）。 
可以将某个具体的版本打上一个标签，这样就不需要记忆复杂的版本号哈希值字符串了，例如你可以使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 来标记这个被你还原的版本，那么以后你想查看该版本时，就可以使用 revert_version标签名，而不是哈希值了。</p>
<h3 id="4-git">4. Git服务器操作命令（与服务器交互）</h3>
<h4 id="41-git-clone">4.1. Git clone</h4>
<p>取出服务器的仓库的代码到本地建立的目录中（与服务器交互） 
通过git clone获取远端git库后，.git/config中的开发者信息不会被一起clone过来。仍然需要为本地库的.git/config文件添加开发者信息。此外，开发者还需要自己添加   . gitignore文件。 
通过git clone获取的远端git库，只包含了远端git库的当前工作分支。如果想获取其它分支信息，需要使用 “git branch –r” 来查看， 如果需要将远程的其它分支代码也获取过来，可以使用命令 “ git checkout -b 本地分支名 远程分支名”，其中，远程分支名为 “git branch –r” 所列出的分支名， 一般是诸如“origin/分支名”的样子。如果本地分支名已经存在， 则不需要“-b”参数。 
例如： 
clip_image006[5]</p>
<h4 id="42-git-pull">4.2. Git pull</h4>
<p>从服务器的仓库中获取代码，和本地代码合并。（与服务器交互，从服务器上下载最新代码，等同于： Git fetch + Git merge） 
从其它的版本库（既可以是远程的也可以是本地的）将代码更新到本地，例如：“git pull origin master ”就是将origin这个版本库的代码更新到本地的master主分支。 
git pull可以从任意一个git库获取某个分支的内容。用法如下： 
git pull username@ipaddr:远端repository名远端分支名 本地分支名。这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中，如果不写本地分支名，则默认pull到本地当前分支。 
需要注意的是，git pull也可以用来合并分支。 和git merge的作用相同。 因此，如果你的本地分支已经有内容，则git pull会合并这些文件，如果有冲突会报警。 
例如： 
clip_image008</p>
<p>clip_image010</p>
<p>clip_image012
clip_image014</p>
<h4 id="43-git-push">4.3. Git push</h4>
<p>将本地commit的代码更新到远程版本库中，例如 “git push origin”就会将本地的代码更新到名为orgin的远程版本库中。 
git push和git pull正好想反，是将本地某个分支的内容提交到远端某个分支上。用法： git pushusername@ipaddr:远端repository名本地分支名 远端分支名。这条命令将本地git库的一个本地分支push到远端git库的远端分支名中。 
需要格外注意的是，git push好像不会自动合并文件。因此，如果git push时，发生了冲突，就会被后push的文件内容强行覆盖，而且没有什么提示。 这在合作开发时是很危险的事情。 
例如： <!-- raw HTML omitted --> 
clip_image016</p>
<h4 id="44-git-fetch">4.4. Git fetch</h4>
<p>从服务器的仓库中下载代码。（与服务器交互，从服务器上下载最新代码） 
相当于从远程获取最新版本到本地，不会自动merge，比Git pull更安全些。 
使用此方法来获取服务器上的更新。 
例如：如果使用git checkout nov/eclair_rocket （nov/eclair_rocket为服务器上的分支名），则是获取上次使用git fetch命令时从服务器上下载的代码；如果先使用 git fetch ，再使用git checkout nov/eclair_rocket，则是先从服务器上获取最新的更新信息，然后从服务器上下载最新的代码</p>
<h2 id="git-">git 忽略指定文件</h2>
<p>有些文件是我们并不想加入也无需被添加到 Git 管理中，同时也不希望他出现在未跟踪列表中。例如在编译过程中生成的 o 文件。 “.gitignore” 文件可以达到这个效果。</p>
<h3 id="heading">一、局部和全局设置</h3>
<pre><code>.gitignore 有全局和局部两种：
</code></pre>
<ol>
<li>全局
通过修改全局配置 git config 中的 excludesfile 指定全局忽略文件。设置方法：</li>
</ol>
<p>$ git config &ndash;global core.excludesfile ~/.gitignore</p>
<pre><code>修改 ~/.gitignore 这个文件将作用于所有 git 项目，并且作用于项目实例中的所有被跟踪的目录。比如说我们可以在该文件中添加 *.o 来忽略所有 .o 文件。
</code></pre>
<ol start="2">
<li>局部
忽略文件默认为当前目录的 .gitignore ，但它只作用于当前目录下。上面说到，在全局的 .gitignore 文件中添加 *.o 会忽略所有目录下产生的 .o 文件，但在当前目录下的 .gitignore 中添加 *.o 却只能忽略当前目录下的 .o 文件。</li>
</ol>
<h3 id="heading1">二、语法</h3>
<pre><code>.gitignore 的语法规范如下：

·所有空行或者以注释符号 ＃ 开头的行都会被 Git 忽略；
·可以使用标准的 glob 模式匹配。 * 匹配模式最后跟反斜杠（/）说明要忽略的是目录。 * 要忽略指定模式以外的文件或目录，可以在模式前加上惊叹号（!）取反。

glob 模式匹配：
·星号（*）匹配零个或多个任意字符；
·[abc] 匹配任何一个列在方括号中的字符（这个例子要么匹配一个 a，要么匹配一个 b，要么匹配一个 c）；
·问号（?）只匹配一个任意字符；
·[0-9a-zA-Z] 在方括号中使用短划线分隔两个字符，表示所有在这两个字符范围内的都可以匹配（比如 [0-9a-zA-Z] 表示匹配所有 0 到 9 的数字和所有字母）；
·\ 转义字符。

注：理论上来说，在要忽略的格式文件后面添加注释是允许的，但经过我的验证，结果发现这样子操作并不能达到预期的效果。
</code></pre>
<h3 id="heading2">三、例子</h3>
<pre><code>一个 .gitignore 例子。

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a 
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件，不包括 subdir/TODO 
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
</code></pre>
<h3 id="git-1">Git 常用命令大全</h3>
<h6 id="git-2">Git 是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码，管理私人的文档和源代码也有很多优势。</h6>
<h5 id="git1">Git常用操作命令：</h5>
<h6 id="1-">1) 远程仓库相关命令</h6>
<p>检出仓库：$ git clone git://github.com/jquery/jquery.git</p>
<p>查看远程仓库：$ git remote -v</p>
<p>添加远程仓库：$ git remote add [name] [url]</p>
<p>删除远程仓库：$ git remote rm [name]</p>
<p>修改远程仓库：$ git remote set-url &ndash;push [name] [newUrl]</p>
<p>拉取远程仓库：$ git pull [remoteName] [localBranchName]</p>
<p>推送远程仓库：$ git push [remoteName] [localBranchName]</p>
<p>*如果想把本地的某个分支test提交到远程仓库，并作为远程仓库的master分支，或者作为另外一个名叫test的分支，如下：</p>
<p>$git push origin test:master         // 提交本地test分支作为远程的master分支</p>
<p>$git push origin test:test              // 提交本地test分支作为远程的test分支</p>
<h6 id="2branch">2）分支(branch)操作相关命令</h6>
<p>查看本地分支：$ git branch</p>
<p>查看远程分支：$ git branch -r</p>
<p>创建本地分支：$ git branch [name] &mdash;-注意新分支创建后不会自动切换为当前分支</p>
<p>切换分支：$ git checkout [name]</p>
<p>创建新分支并立即切换到新分支：$ git checkout -b [name]</p>
<p>删除分支：$ git branch -d [name] &mdash;- -d选项只能删除已经参与了合并的分支，对于未有合并的分支是无法删除的。如果想强制删除一个分支，可以使用-D选项</p>
<p>合并分支：$ git merge [name] &mdash;-将名称为[name]的分支与当前分支合并</p>
<p>创建远程分支(本地分支push到远程)：$ git push origin [name]</p>
<p>删除远程分支：$ git push origin :heads/[name] 或 $ gitpush origin :[name]</p>
<p>*创建空的分支：(执行命令之前记得先提交你当前分支的修改，否则会被强制删干净没得后悔)</p>
<p>$git symbolic-ref HEAD refs/heads/[name]</p>
<p>$rm .git/index</p>
<p>$git clean -fdx</p>
<h6 id="3tag">3）版本(tag)操作相关命令</h6>
<p>查看版本：$ git tag</p>
<p>创建版本：$ git tag [name]</p>
<p>删除版本：$ git tag -d [name]</p>
<p>查看远程版本：$ git tag -r</p>
<p>创建远程版本(本地版本push到远程)：$ git push origin [name]</p>
<p>删除远程版本：$ git push origin :refs/tags/[name]</p>
<p>合并远程仓库的tag到本地：$ git pull origin &ndash;tags</p>
<p>上传本地tag到远程仓库：$ git push origin &ndash;tags</p>
<p>创建带注释的tag：$ git tag -a [name] -m &lsquo;yourMessage&rsquo;</p>
<h6 id="4-submodule">4) 子模块(submodule)相关操作命令</h6>
<p>添加子模块：$ git submodule add [url] [path]</p>
<p>如：$git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs</p>
<p>初始化子模块：$ git submodule init  &mdash;-只在首次检出仓库时运行一次就行</p>
<p>更新子模块：$ git submodule update &mdash;-每次更新或切换分支后都需要运行一下</p>
<p>删除子模块：（分4步走哦）</p>
<ol>
<li>
<p>$ git rm &ndash;cached [path]</p>
</li>
<li>
<p>编辑“.gitmodules”文件，将子模块的相关配置节点删除掉</p>
</li>
<li>
<p>编辑“ .git/config”文件，将子模块的相关配置节点删除掉</p>
</li>
<li>
<p>手动删除子模块残留的目录</p>
</li>
</ol>
<h6 id="5">5）忽略一些文件、文件夹不提交</h6>
<p>在仓库根目录下创建名称为“.gitignore”的文件，写入不需要的文件夹名或文件，每个元素占一行即可，如</p>
<p>target</p>
<p>bin</p>
<p>*.db</p>
<p>=====================</p>
<h5 id="git-3">Git 常用命令</h5>
<h2 id="git-stash-pop-pop">git branch 查看本地所有分支
git status 查看当前状态 
git commit 提交 
git branch -a 查看所有的分支
git branch -r 查看本地所有分支
git commit -am &ldquo;init&rdquo; 提交并且加注释 
git remote add origin <a href="mailto:git@192.168.1.119">git@192.168.1.119</a>:ndshow
git push origin master 将文件给推到服务器上 
git remote show origin 显示远程库origin里的资源 
git push origin master:develop
git push origin master:hb-dev 将本地库与服务器上的库进行关联 
git checkout &ndash;track origin/dev 切换到远程dev分支
git branch -D master develop 删除本地库develop
git checkout -b dev 建立一个新的本地分支dev
git merge origin/dev 将分支dev与当前分支进行合并
git checkout dev 切换到本地dev分支
git remote show 查看远程库
git add .
git rm 文件名(包括路径) 从git中删除指定文件
git clone git://github.com/schacon/grit.git 从服务器上将代码给拉下来
git config &ndash;list 看所有用户
git ls-files 看已经被提交的
git rm [file name] 删除一个文件
git commit -a 提交当前repos的所有的改变
git add [file name] 添加一个文件到git index
git commit -v 当你用－v参数的时候可以看commit的差异
git commit -m &ldquo;This is the message describing the commit&rdquo; 添加commit信息
git commit -a -a是代表add，把所有的change加到git index里然后再commit
git commit -a -v 一般提交命令
git log 看你commit的日志
git diff 查看尚未暂存的更新
git rm a.a 移除文件(从暂存区和工作区中删除)
git rm &ndash;cached a.a 移除文件(只从暂存区中删除)
git commit -m &ldquo;remove&rdquo; 移除文件(从Git中删除)
git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)
git diff &ndash;cached 或 $ git diff &ndash;staged 查看尚未提交的更新
git stash push 将文件给push到一个临时空间中
git stash pop 将文件从临时空间pop下来</h2>
<h2 id="git-push-origin-master-">git remote add origin <a href="mailto:git@github.com">git@github.com</a>:username/Hello-World.git
git push origin master 将本地项目给提交到服务器中</h2>
<h2 id="git-pull-">git pull 本地与服务器端同步</h2>
<h2 id="git-push-origin-serverfixawesomebranch">git push (远程仓库名) (分支名) 将本地分支推送到服务器上去。
git push origin serverfix:awesomebranch</h2>
<p>git fetch 相当于是从远程获取最新版本到本地，不会自动merge
git commit -a -m &ldquo;log_message&rdquo; (-a是提交所有改动，-m是加入log信息) 本地修改同步至服务器端 ：
git branch branch_0.1 master 从主分支master创建branch_0.1分支
git branch -m branch_0.1 branch_1.0 将branch_0.1重命名为branch_1.0
git checkout branch_1.0/master 切换到branch_1.0/master分支
du -hs</p>
<hr>
<p>mkdir WebApp
cd WebApp
git init
touch README
git add README
git commit -m &lsquo;first commit&rsquo;
git remote add origin <a href="mailto:git@github.com">git@github.com</a>:daixu/WebApp.git
git push -u origin master</p>
<h3 id="git-4">Git 常用命令图表</h3>
<p><img src="/image/GitImage/2010072023345292.png" alt="Alt text"></p>
<h3 id="ssh-key--">SSH key  生成步骤</h3>
<h6 id="1ssh---keywindowscsshidrsaidrsapub">第1步：创建SSH   Key。在windows下查看[c盘-&gt;用户-&gt;自己的用户名-&gt;.ssh]下是否有id_rsa、id_rsa.pub文件，如果没有需要手动生成。</h6>
<p>打开git bash，在控制台中输入以下命令。</p>
<pre><code>$ ssh-keygen -t rsa -C &quot;youremail@example.com&quot;
</code></pre><p>密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。这里使用的是rsa。
同时在密钥中有一个注释字段，用-C来指定所指定的注释，可以方便用户标识这个密钥，指出密钥
的用途或其他有用的信息。所以在这里输入自己的邮箱或者其他都行。
输入完毕后程序同时要求输入一个密语字符串(passphrase)，空表示没有密语。接着会让输入2次口
令(password)，空表示没有口令。3次回车即可完成当前步骤，此时[c盘&gt;用户&gt;自己的用户名&gt;.ssh]目录下已经生成好了。</p>
<h6 id="2">第2步：</h6>
<p>登录github。打开setting-&gt;SSH keys，点击右上角 New SSH key，把生成好的公钥id_rsa.pub放进 key输入框中，再为当前的key起一个title来区分每个key。
登录码云  右上角 L-&gt;设置-&gt;SSH公钥</p>
<p>id_rsa 私钥、id_rsa.pub公钥。公钥放在gitHub 或码云上。sourceTree里选择OpenSSH会自动找到
该私钥。</p>
<p>工具&ndash;&gt;选项&ndash;&gt;SSH 客户端：选择OpenSSH才会自动在.ssh找私钥。</p>

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

